# 模块导入
from . import Book
from . import database


# Product表的mapper
class BookMapper:
    # query
    # 根据id查找Book项
    # <Book 1>
    @staticmethod
    def query_book_id(book_id):
        return Book.query.get(book_id)

    # 查找book列表
    # [<Book 1>, <Book 2>, ...]
    @staticmethod
    def query_all():
        return Book.query.filter().all()

    # 根据图书名称book_name查询（列表）
    # [<Book 1>, <Book 2>, ...]
    @staticmethod
    def query_book_name(book_name):
        return Book.query.filter_by(book_name=book_name).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # 根据图书名称book_name模糊查询（列表）
    @staticmethod
    def query_book_name_like(keyword):
        return Book.query.filter(Book.book_name.like('%' + keyword + '%')).all()

    # 根据图书作者author查询（列表）
    @staticmethod
    def query_author(author):
        return Book.query.filter_by(author=author).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # 根据图书作者author模糊查询（列表）
    @staticmethod
    def query_author_like(keyword):
        return Book.query.filter(Book.author.like('%' + keyword + '%')).all()

    # 根据借阅次数范围borrow_count查询（列表）（注意，这个和以后带“范围”的一些查询需要使用`query.filter(xx > xx)`）
    @staticmethod
    def query_age(borrow_count_min, borrow_count_max):
        return Book.query.filter(Book.age.between(borrow_count_min, borrow_count_max)).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # 根据当前库存数量current_number范围查询（列表）（注意，这个和以后带“范围”的一些查询需要使用`query.filter(xx > xx)`）
    @staticmethod
    def query_current_number(current_number_min, current_number_max):
        return Book.query.filter(Book.current_number.between(current_number_min, current_number_max)).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # 根据当前库存number范围查询（列表）（注意，这个和以后带“范围”的一些查询需要使用`query.filter(xx > xx)`）
    @staticmethod
    def query_number(number_min, number_max):
        return Book.query.filter(Book.number.between(number_min, number_max)).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # 根据大类id category_id查询（列表）
    # [<Book 1>, <Book 2>, ...]
    @staticmethod
    def query_category_id(category_id):
        return Book.query.filter_by(category_id=category_id).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # 根据小类id product_id查询（列表）
    # [<Book 1>, <Book 2>, ...]
    @staticmethod
    def query_product_id(product_id):
        return Book.query.filter_by(product_id=product_id).all()
        # 同样的，在需要列表的时候，可以使用 .all 方法来获得列表

    # insert
    # 增加一个book项
    @staticmethod
    def insert(book_name, category_id, product_id):
        book = Book(book_name=book_name, category_id=category_id, product_id=product_id)
        database.session.add(book)
        database.session.commit()
        return "insert success"

    # 全部添加book项
    @staticmethod
    def insert_param(book_name, author, text, image_url, borrow_count, current_number, number, category_id, product_id):
        book = Book(book_name=book_name, author=author, text=text, image_url=image_url, borrow_count=borrow_count,
                    current_number=current_number, number=number, category_id=category_id, product_id=product_id)
        database.session.add(book)
        database.session.commit()
        return "insert success"

    # update
    # 更新book项
    @staticmethod
    def update(book_id, book_name, author, text, image_url, borrow_count, current_number, number, category_id,
               product_id):
        book = Book.query.get(book_id)
        book.book_name = book_name
        book.author = author
        book.text = text
        book.image_url = image_url
        book.borrow_count = borrow_count
        book.current_number = current_number
        book.number = number
        book.category_id = category_id
        book.product_id = product_id
        database.session.commit()
        return "update success"

    # 便捷接口
    # 借阅数量+1 现存数量-1
    @staticmethod
    def update_borrow_add_current_sub(id):
        book = Book.query.get(id)
        book.borrow_count += 1
        book.current_number -= 1
        database.session.commit()
        return "update success"

    # 现存数量+1
    @staticmethod
    def update_current_add(id):
        book = Book.query.get(id)
        book.current_number += 1
        database.session.commit()
        return "update success"

    # delete
    # 删除book项
    @staticmethod
    def delete(id):
        book = Book.query.get(id)
        database.session.delete(book)
        database.session.commit()
        return "delete success"
